﻿using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace YouDaoNotesCodes
{
    class XmlAnalysis
    {
        #region  本地xml解析
        /// <summary>
        /// 本地xml解析
        /// </summary>
        public void readXml()
        {
            ArrayList list = new ArrayList();//定义ArrayList存放解析字段
            XmlDocument xdoc = new XmlDocument();
            xdoc.Load("../xml/user.xml");//区别：XmlDocument.Load("xml文件路径，注意路径格式！")或者XmlDocument.LoadXml("xml报文");
            XmlNodeList xNodes = xdoc.SelectNodes("users/user");
            PubCommon.WriteLog("获取的个数：" + xNodes.Count.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name);
            if (xNodes != null)
            {
                int i = 0;
                //方式1：普通  输出user节点下的节点值，可选择
                foreach (XmlNode xNode in xNodes)
                {
                    string tmp = xNode.InnerText; //输出循环节点          
                    string name = xNode.SelectSingleNode("name").InnerText;
                    string age = xNode.SelectSingleNode("age").InnerText;
                    string sex = xNode.SelectSingleNode("sex").InnerText;
                    string str = name + "," + age + "," + sex + " ";
                    list.Add(str);
                    i++;
                }
                //方式2：ChildNodes 输出user节点下的所有节点值。
                //问题：一次性,user一共4组，为什么输出的仅仅是第一组？默认第一组？？这玩意不好遍历？XmlNodeList是王道啊！
                XmlNode x = xdoc.SelectSingleNode("users/user");
                foreach (XmlNode xn in x.ChildNodes)
                {
                    string allnode = xn.InnerText;
                    list.Add(xn.InnerText);
                }

                //方式3：DataSet
                DataSet ds = new DataSet();
                ds.ReadXml(new XmlTextReader(new StringReader("../xml/user.xml路径下的xml添加至此")));
                DataTable dt = ds.Tables["user"];

                foreach (DataRow dr in dt.Rows)
                {
                    foreach (DataColumn dc in dr.Table.Columns)
                    {
                        string n = dc.ColumnName;
                        string value = dr[n].ToString();
                        Console.WriteLine(n);
                        Console.WriteLine(value);
                    }
                }
            }
            foreach (string i in list)
            {
                Console.Write("{0},", i);
            }
            Console.ReadKey();
        }
        #endregion

        #region DataSet、DataTable、DataRow、DataColumn用法
        /// <summary>
        /// DataSet、DataTable、DataRow、DataColumn用法
        /// </summary>
        public void XmlOther()
        {
            string JSONDATA = "{'info': [{'name': 'Jay Chou','age':'35'},{'name': 'Alan Walker','age':'21'},{'name':'Taylor Swift','age':'26'}]}";//JSON数组
            DataSet ds = new DataSet();
            ds = JsonConvert.DeserializeObject<DataSet>(JSONDATA);
            DataTable dt = new DataTable();
            dt = ds.Tables[0];
            Console.WriteLine("1、遍历一个表多行多列-----完整输出这3行2列：");
            foreach (DataRow dr in ds.Tables[0].Rows)//遍历一个表多行多列
            {
                foreach (DataColumn dc in ds.Tables[0].Columns)
                {
                    Console.WriteLine(dr[dc].ToString());
                }
            }
            Console.WriteLine("2、遍历一个表多行一列-----完整输出这3行1列：");
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                Console.WriteLine(row[0].ToString());//row[0]、row[1]分别代表name、age
            }
            Console.WriteLine("3、遍历一个表一行一列-----完整输出这1行1列：");
            string str = ds.Tables[0].Rows[0]["name"].ToString();
            Console.WriteLine(str);

            Console.ReadKey();
        }
        #endregion

        #region 最基本的解析:取节点值、特性值
        public void AnaXml()
        {
            try
            {
                XmlDocument xdoc = new XmlDocument();
                xdoc.Load("xml/users.xml");//debug目录下
                XmlNodeList xnodes = xdoc.SelectNodes("root/users");//返回所有user节点值

                //扩展
                XmlNode xnode = xdoc.SelectSingleNode("root/users");//只返回第一个users节点值
                XmlNode xnode0 = xnodes[0];//我要第一个users节点值

                //遍历每一个users
                foreach (XmlNode xn in xnodes)
                {
                    if (xn.SelectSingleNode("name").InnerText.Equals("Jerry"))
                    {
                        string characterName = xn.Attributes["characterName"].Value;//Jerry信息
                        string name = xn.SelectSingleNode("name").Attributes["description"].Value;//姓名
                    }
                    else
                    {
                        XmlNodeList nameList = xn.SelectNodes("name");//name
                        string nameDesc = xn.SelectSingleNode("name").Attributes["description"].Value;//gnplum
                        foreach (XmlNode nameNode in nameList)
                        {
                            XmlNodeList infoList = nameNode.SelectNodes("Info");//info list
                            //继续解析就可以
                            Console.WriteLine(JsonConvert.SerializeObject(infoList));

                        }
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
        }
        #endregion

        #region utf-16解析
        private void AnalyseUtf16()
        {
            //解析utf16
            //方法1：头文件utf-8改为utf-16（xml.Replace("utf-16", "utf-8")或直接更改为头文件）
            //方法2： 将 xml 文件编码修改成 Unicode
            //方法3：将 xml 文件以文本的方式读取进字符串，再通过 LoadXml 方式加载到 XmlDocument 中。
            string xmlContent = File.ReadAllText("E://LG_test.xml");//
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xmlContent);

            XmlNode node = xmlDoc.SelectSingleNode("//ResultOfARAPInfo");
            string flag = node.Attributes["ResultFlag"].InnerText;
            string error = node.Attributes["ErrorMessage"].InnerText;

            Console.WriteLine(flag);
            Console.WriteLine(error);
        }
        #endregion
    }
}
